package xadrez;



import javax.swing.JOptionPane;
import java.awt.*;

public class Tabuleiro {

    private Peca[][] matriz;    

    public Tabuleiro() {
        this.matriz = new Peca[8][8];        
        for (int x = 0; x < 8; x++) {
            for (int y = 0; y < 8; y++) {
                switch (y) {
                    case 0:
                        if (x == 0 || x == 7) {
                            this.matriz[x][y] = new Peca('t', x, y, "preto");
                        } else if (x == 1 || x == 6) {
                            this.matriz[x][y] = new Peca('c', x, y, "preto");
                        } else if (x == 2 || x == 5) {
                            this.matriz[x][y] = new Peca('b', x, y,"preto");
                        } else if (x == 3) {
                            this.matriz[x][y] = new Peca('q', x, y, "preto");
                        } else {
                            this.matriz[x][y] = new Peca('k', x, y, "preto");
                        }
                        break;
                    case 1:
                        this.matriz[x][y] = new Peca('p', x, y, "preto");
                        break;
                    case 6:
                        this.matriz[x][y] = new Peca('p', x, y, "branco");
                        break;
                    case 7:
                        if (x == 0 || x == 7) {
                            this.matriz[x][y] = new Peca('t', x, y, "branco");
                        } else if (x == 1 || x == 6) {
                            this.matriz[x][y] = new Peca('c', x, y, "branco");
                        } else if (x == 2 || x == 5) {
                            this.matriz[x][y] = new Peca('b', x, y, "branco");
                        } else if (x == 3) {
                            this.matriz[x][y] = new Peca('q', x, y, "branco");
                        } else {
                            this.matriz[x][y] = new Peca('k', x, y, "branco");
                        }
                        break;
                    default:
                        this.matriz[x][y] = new Peca('x', x, y, "null");
                        break;
                }
            }
        }
    }
    
    public void limpaTabuleiro() {
    	this.matriz = new Peca[8][8];
        for (int x = 0; x < 8; x++) {
    		for (int y = 0; y < 8; y++) {
    			matriz[x][y] = new Peca('x', x, y, "null");
    		}
    	}
        
    }

    public void TabuleiroTeste() {
        this.matriz = new Peca[8][8];
        for (int x = 0; x < 8; x++) {
            for (int y = 0; y < 8; y++) {
                this.matriz[x][y] = new Peca('x', x, y, "null");
            }
        }
        this.matriz[4][0] = new Peca('k', 4, 0, "preto");
        this.matriz[4][7] = new Peca('k', 4, 7, "branco");
        //this.matriz[7][4] = new Peca('q', 7, 4, "branco");
        this.matriz[7][1] = new Peca('p', 7, 1, "branco");
        //this.matriz[0][7] = new Peca('t', 0, 7, "branco");
    }

    
    //Verifica se a peça é da cor escolhida
    public boolean VerificaValidade(int i, int j, String cor) {
        boolean validade = false;
        if (this.matriz[i][j].GetCor().equals(cor)) {
            validade = true;
        }
        return validade;
    }

    //Verifica se a peÃ§a i,j pode se mover para posiÃ§Ã£o a,b
    public boolean VerificaJogada(int i, int j, int a, int b) {
        boolean validaMovimento;

        //So entra no if em caso de ROQUE
        if (this.matriz[i][j].GetCor().equals(this.matriz[a][b].GetCor())){
            validaMovimento = true;
        }else{
            boolean matrizAjuda[][] = new boolean[8][8];
            matrizAjuda = this.matriz[i][j].PossiveisMovimentos(this.matriz, i, j);
            validaMovimento = matrizAjuda[a][b];
        }
        return validaMovimento;
    }

    // NÃ£o verifica quando o rei nÃ£o pode se mover
    public boolean VerificaPossibilidade(int x, int y, String cor) {
        boolean podeJogar = false;
        boolean vCheck = false;
        Peca pecaAux1;
        Peca pecaAux2;
        if (matriz[x][y].GetCor().equals(cor)) {
            boolean matrizAjuda[][] = new boolean[8][8];
            matrizAjuda = matriz[x][y].PossiveisMovimentos(this.matriz, x, y);
            int i = 0;
            int j = 0;
            while ((i < 8) & (!podeJogar)) {
                j = 0;
                while ((j < 8) & (!podeJogar)) {
                    if (matrizAjuda[i][j]) {
                        pecaAux1 = GetPeca(x, y);
                        pecaAux2 = GetPeca(i, j);
                        FazJogada(x, y, i, j);
                        vCheck = VerificaCheck(cor);
                        if (!vCheck) {
                            podeJogar = true;
                        }
                        SetPeca(pecaAux1, x, y);
                        SetPeca(pecaAux2, i, j);
                    }
                    j++;
                }
                i++;
            }
        }
        return podeJogar;
    }

    public boolean ConfirmaCheckMate(String cor) {
        boolean vCheckMate = true;
        boolean verifica;
        Peca pecaAux1;
        Peca pecaAux2;
        boolean matrizAjuda[][] = new boolean[8][8];
        int i = 0;
        int j = 0;
        int a = 0;
        int b = 0;
        while ((i < 8) & (vCheckMate)) {
            j = 0;
            while ((j < 8) & (vCheckMate)) {
                if (matriz[i][j].GetCor().equals(cor)) {
                    matrizAjuda = matriz[i][j].PossiveisMovimentos(this.matriz, i, j);
                    a = 0;
                    while ((a < 8) & (vCheckMate)) {
                        b = 0;
                        while ((b < 8) & (vCheckMate)) {
                            if (matrizAjuda[a][b]) {
                                pecaAux1 = GetPeca(i, j);
                                pecaAux2 = GetPeca(a, b);
                                FazJogada(i, j, a, b);
                                verifica = VerificaCheck(cor);
                                if (!verifica) {
                                    vCheckMate = false;
                                }
                                SetPeca(pecaAux1, i, j);
                                SetPeca(pecaAux2, a, b);
                            }
                            b++;
                        }
                        a++;
                    }
                }
                j++;
            }
            i++;
        }
        return vCheckMate;
    }

    public void MudarPeao(int x, int y, int tipo) {
        String color = matriz[x][y].GetCor();
        int movimentos = matriz[x][y].GetMovimentos();
        switch (tipo) {
            case 1:
                matriz[x][y] = new Peca('q', x, y, color);
                break;
            case 2:
                matriz[x][y] = new Peca('t', x, y, color);
                break;
            case 3:
                matriz[x][y] = new Peca('b', x, y, color);
                break;
            case 4:
                matriz[x][y] = new Peca('c', x, y, color);
                break;
        }
        matriz[x][y].SetMovimentos(movimentos);
    }

    public void AdicionaMovimento(int x, int y) {
        matriz[x][y].UpMovimentos();
    }

    public boolean VerificaCheck(String cor) {
        boolean check = false;
        int posRei[];
        boolean matrizAjuda[][] = new boolean[8][8];
        int i = 0;
        int j = 0;
        posRei = ProcuraPosicaoRei(cor);
        int x = posRei[0];
        int y = posRei[1];
        while ((i < 8) & !check) {
            j = 0;
            while ((j < 8) & !check) {
                if (!matriz[i][j].GetCor().equals(cor)) {
                    if (!(matriz[i][j].GetTipo() == 'x')) {
                        matrizAjuda = matriz[i][j].PossiveisMovimentos(matriz, i, j);
                        if (matrizAjuda[x][y]) {
                            check = true;
                        }
                    }
                }
                j++;
            }
            i++;
        }
        return check;
    }

    private int[] ProcuraPosicaoRei(String cor) {
        int vetor[] = new int[2];
        for (int x = 0; x < 8; x++) {
            for (int y = 0; y < 8; y++) {
                if (matriz[x][y].GetTipo() == 'k') {
                    if (matriz[x][y].GetCor().equals(cor)) {
                        vetor[0] = x;
                        vetor[1] = y;
                    }
                }
            }
        }
        return vetor;
    }

    //Verifica se a casa x,y estÃ¡ ameaÃ§ada pela cor corAtacante
    public boolean VerificaCasaAmeacada(int x, int y, String corAtacante){
        boolean ajuda;
        boolean resultado = false;
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                if (matriz[i][j].GetCor().equals(corAtacante)) {
                    ajuda = VerificaJogada(i,j,x,y);
                    if (ajuda){
                        resultado = true;
                    }
                }
            }
        }
        //System.out.println("resultado =" + resultado);
        return resultado;
    }

    public void FazJogada(int i, int j, int k, int l) {
        Peca auxiliar = this.matriz[i][j];
        Peca roque = this.matriz[k][l];
        

        //So entra no if em caso de ROQUE
        if(this.matriz[i][j].GetCor().equals(this.matriz[k][l].GetCor())){
            if(k==0){
                this.matriz[k+2][l] = new Peca(auxiliar.GetTipo(), k+2, l,auxiliar.GetCor());                
                this.matriz[i-1][j] = new Peca(roque.GetTipo(), i-1, j,roque.GetCor());
                this.matriz[i-1][j].UpMovimentos();
            }
            else{
                this.matriz[k-1][l] = new Peca(auxiliar.GetTipo(), k-1, l,auxiliar.GetCor());
                this.matriz[i+1][j] = new Peca(roque.GetTipo(), i+1, j,roque.GetCor());
                this.matriz[i+1][j].UpMovimentos();
            }
            this.matriz[k][l] = new Peca('x', k, l,"null");
            this.matriz[i][j] = new Peca('x', i, j,"null");
        }else{
            this.matriz[k][l] = new Peca(auxiliar.GetTipo(), k, l,auxiliar.GetCor());
            this.matriz[k][l].SetMovimentos(auxiliar.GetMovimentos());
            this.matriz[i][j] = new Peca('x', i, j,"null");
        }
    }

    public int AlgoritimoDeCusto(String cor) {
        int pontos = 0;
        int k;
        int contador = 0;
        boolean vCheck;
        //boolean obstaculo;
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                if (matriz[i][j].GetCor().equals(cor)){
                    if (matriz[i][j].GetCor().equals("branco")){
                        switch (matriz[i][j].GetTipo()){
                            case 'p':
                                pontos = pontos + 100;
                                if (j == 6){
                                    if ((i==0) || (i==7)){
                                        pontos = pontos +1;
                                    }else{
                                        if ((i==1) || (i==6)){
                                            pontos = pontos + 2;
                                        }else{
                                        if ((i==2) || (i==5)){
                                            pontos = pontos + 3;
                                            }else{
                                            if ((i==3) || (i==4)){
                                                pontos = pontos + 4;
                                                }
                                            }
                                        }
                                    }
                                }else{
                                    if (j == 5){
                                        if ((i==0) || (i==7)){
                                            pontos = pontos +2;
                                        }else{
                                            if ((i==1) || (i==6)){
                                                pontos = pontos + 4;
                                            }else{
                                            if ((i==2) || (i==5)){
                                                pontos = pontos + 6;
                                                }else{
                                                if ((i==3) || (i==4)){
                                                    pontos = pontos + 8;
                                                    }
                                                }
                                            }
                                        }
                                    }else{
                                        if (j == 4){
                                            if ((i==0) || (i==7)){
                                                pontos = pontos +3;
                                            }else{
                                                if ((i==1) || (i==6)){
                                                    pontos = pontos + 6;
                                                }else{
                                                if ((i==2) || (i==5)){
                                                    pontos = pontos + 9;
                                                    }else{
                                                    if ((i==3) || (i==4)){
                                                        pontos = pontos + 12;
                                                        }
                                                    }
                                                }
                                            }
                                        }else{
                                            if (j == 3){
                                                if ((i==0) || (i==7)){
                                                    pontos = pontos +4;
                                                }else{
                                                    if ((i==1) || (i==6)){
                                                        pontos = pontos + 8;
                                                    }else{
                                                    if ((i==2) || (i==5)){
                                                        pontos = pontos + 12;
                                                        }else{
                                                        if ((i==3) || (i==4)){
                                                            pontos = pontos + 16;
                                                            }
                                                        }
                                                    }
                                                }
                                            }else{
                                                if (j == 2){
                                                    if ((i==0) || (i==7)){
                                                        pontos = pontos +5;
                                                    }else{
                                                        if ((i==1) || (i==6)){
                                                            pontos = pontos + 10;
                                                        }else{
                                                        if ((i==2) || (i==5)){
                                                            pontos = pontos + 15;
                                                            }else{
                                                            if ((i==3) || (i==4)){
                                                                pontos = pontos + 20;
                                                                }
                                                            }
                                                        }
                                                    }
                                                }else{
                                                   if (j == 1){
                                                        if ((i==0) || (i==7)){
                                                            pontos = pontos +6;
                                                        }else{
                                                            if ((i==1) || (i==6)){
                                                                pontos = pontos + 12;
                                                            }else{
                                                            if ((i==2) || (i==5)){
                                                                pontos = pontos + 18;
                                                                }else{
                                                                if ((i==3) || (i==4)){
                                                                    pontos = pontos + 24;
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                                break;
                            case 't':
                                pontos = pontos + 500;
                                contador = 0;
                                for (k = 0; k <8; k++){
                                    if (matriz[k][j].GetTipo() == 't'){
                                        contador = contador +1;
                                    }
                                }
                                if (contador == 2){
                                    pontos = pontos + 15;
                                }
                                if (j == 1){
                                    pontos = pontos + 20;
                                }
                                break;
                            case 'c':
                                pontos = pontos + 300;
                                contador = 0;
                                if ((i+2)<8){
                                    if((j+1)<8){
                                        if(!matriz[i+2][j+1].GetCor().equals(cor)){
                                            contador = contador +1;
                                        }
                                    }
                                    if((j-1)>=0){
                                        if(!matriz[i+2][j-1].GetCor().equals(cor)){
                                            contador = contador +1;
                                        }
                                    }
                                }
                                if ((i-2)>=0){
                                    if((j+1)<8){
                                        if(!matriz[i-2][j+1].GetCor().equals(cor)){
                                            contador = contador +1;
                                        }
                                    }
                                    if((j-1)>=0){
                                        if(!matriz[i-2][j-1].GetCor().equals(cor)){
                                            contador = contador +1;
                                        }
                                    }
                                }
                                if ((j+2)<8){
                                    if((i+1)<8){
                                        if(!matriz[i+1][j+2].GetCor().equals(cor)){
                                            contador = contador +1;
                                        }
                                    }
                                    if((i-1)>=0){
                                        if(!matriz[i-1][j+2].GetCor().equals(cor)){
                                            contador = contador +1;
                                        }
                                    }
                                }
                                if ((j-2)>=0){
                                    if((i+1)<8){
                                        if(!matriz[i+1][j-2].GetCor().equals(cor)){
                                            contador = contador +1;
                                        }
                                    }
                                    if((i-1)>=0){
                                        if(!matriz[i-1][j-2].GetCor().equals(cor)){
                                            contador = contador +1;
                                        }
                                    }
                                }
                                if (contador == 0){
                                    pontos = pontos - 6;
                                }else{
                                    if (contador == 1){
                                        pontos = pontos - 2;
                                    }else{
                                        if (contador == 2){
                                            pontos = pontos + 1;
                                        }else{
                                            if (contador == 3){
                                                pontos = pontos + 2;
                                            }else{
                                               if (contador == 4){
                                                    pontos = pontos + 3;
                                                }else{
                                                   if (contador == 5){
                                                        pontos = pontos + 4;
                                                    }else{
                                                       if (contador == 6){
                                                            pontos = pontos + 4;
                                                        }else{
                                                           if (contador == 7){
                                                                pontos = pontos + 5;
                                                            }else{
                                                               if (contador == 8){
                                                                    pontos = pontos + 7;
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                                break;
                            case 'b':
                                pontos = pontos + 320;
                                break;
                            case 'k':
                                break;
                            case 'q':
                                pontos = pontos + 900;
                                if (j == 1){
                                    pontos = pontos + 10;
                                }
                                break;
                            case 'x':
                                JOptionPane.showMessageDialog(null, "ERRO! PEÃ‡A X NÃƒO PODERIA SER JOGADA!");
                               break;
                            default:
                                JOptionPane.showMessageDialog(null, "ERRO! DEFAULT DA MOVIMENTAÃ‡ÃƒO DE PEÃ‡A");
                                break;
                        }
                    }
                    else{
                        switch (matriz[i][j].GetTipo()){
                            case 'p':
                                pontos = pontos + 100;
                                if (j == 1){
                                    if ((i==0) || (i==7)){
                                        pontos = pontos +1;
                                    }else{
                                        if ((i==1) || (i==6)){
                                            pontos = pontos + 2;
                                        }else{
                                        if ((i==2) || (i==5)){
                                            pontos = pontos + 3;
                                            }else{
                                            if ((i==3) || (i==4)){
                                                pontos = pontos + 4;
                                                }
                                            }
                                        }
                                    }
                                }else{
                                    if (j == 2){
                                        if ((i==0) || (i==7)){
                                            pontos = pontos +2;
                                        }else{
                                            if ((i==1) || (i==6)){
                                                pontos = pontos + 4;
                                            }else{
                                            if ((i==2) || (i==5)){
                                                pontos = pontos + 6;
                                                }else{
                                                if ((i==3) || (i==4)){
                                                    pontos = pontos + 8;
                                                    }
                                                }
                                            }
                                        }
                                    }else{
                                        if (j == 3){
                                            if ((i==0) || (i==7)){
                                                pontos = pontos +3;
                                            }else{
                                                if ((i==1) || (i==6)){
                                                    pontos = pontos + 6;
                                                }else{
                                                if ((i==2) || (i==5)){
                                                    pontos = pontos + 9;
                                                    }else{
                                                    if ((i==3) || (i==4)){
                                                        pontos = pontos + 12;
                                                        }
                                                    }
                                                }
                                            }
                                        }else{
                                            if (j == 4){
                                                if ((i==0) || (i==7)){
                                                    pontos = pontos +4;
                                                }else{
                                                    if ((i==1) || (i==6)){
                                                        pontos = pontos + 8;
                                                    }else{
                                                    if ((i==2) || (i==5)){
                                                        pontos = pontos + 12;
                                                        }else{
                                                        if ((i==3) || (i==4)){
                                                            pontos = pontos + 16;
                                                            }
                                                        }
                                                    }
                                                }
                                            }else{
                                                if (j == 5){
                                                    if ((i==0) || (i==7)){
                                                        pontos = pontos +5;
                                                    }else{
                                                        if ((i==1) || (i==6)){
                                                            pontos = pontos + 10;
                                                        }else{
                                                        if ((i==2) || (i==5)){
                                                            pontos = pontos + 15;
                                                            }else{
                                                            if ((i==3) || (i==4)){
                                                                pontos = pontos + 20;
                                                                }
                                                            }
                                                        }
                                                    }
                                                }else{
                                                   if (j == 6){
                                                        if ((i==0) || (i==7)){
                                                            pontos = pontos +6;
                                                        }else{
                                                            if ((i==1) || (i==6)){
                                                                pontos = pontos + 12;
                                                            }else{
                                                            if ((i==2) || (i==5)){
                                                                pontos = pontos + 18;
                                                                }else{
                                                                if ((i==3) || (i==4)){
                                                                    pontos = pontos + 24;
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                                break;
                            case 't':
                                pontos = pontos + 500;
                                contador = 0;
                                for (k = 0; k <8; k++){
                                    if (matriz[k][j].GetTipo() == 't'){
                                        contador = contador +1;
                                    }
                                }
                                if (contador == 2){
                                    pontos = pontos + 15;
                                }
                                if (j==6){
                                    pontos = pontos + 20;
                                }
                                break;
                            case 'c':
                                pontos = pontos + 300;
                                contador = 0;
                                if ((i+2)<8){
                                    if((j+1)<8){
                                        if(!matriz[i+2][j+1].GetCor().equals(cor)){
                                            contador = contador +1;
                                        }
                                    }
                                    if((j-1)>=0){
                                        if(!matriz[i+2][j-1].GetCor().equals(cor)){
                                            contador = contador +1;
                                        }
                                    }
                                }
                                if ((i-2)>=0){
                                    if((j+1)<8){
                                        if(!matriz[i-2][j+1].GetCor().equals(cor)){
                                            contador = contador +1;
                                        }
                                    }
                                    if((j-1)>=0){
                                        if(!matriz[i-2][j-1].GetCor().equals(cor)){
                                            contador = contador +1;
                                        }
                                    }
                                }
                                if ((j+2)<8){
                                    if((i+1)<8){
                                        if(!matriz[i+1][j+2].GetCor().equals(cor)){
                                            contador = contador +1;
                                        }
                                    }
                                    if((i-1)>=0){
                                        if(!matriz[i-1][j+2].GetCor().equals(cor)){
                                            contador = contador +1;
                                        }
                                    }
                                }
                                if ((j-2)>=0){
                                    if((i+1)<8){
                                        if(!matriz[i+1][j-2].GetCor().equals(cor)){
                                            contador = contador +1;
                                        }
                                    }
                                    if((i-1)>=0){
                                        if(!matriz[i-1][j-2].GetCor().equals(cor)){
                                            contador = contador +1;
                                        }
                                    }
                                }
                                if (contador == 0){
                                    pontos = pontos - 6;
                                }else{
                                    if (contador == 1){
                                        pontos = pontos - 2;
                                    }else{
                                        if (contador == 2){
                                            pontos = pontos + 1;
                                        }else{
                                            if (contador == 3){
                                                pontos = pontos + 2;
                                            }else{
                                               if (contador == 4){
                                                    pontos = pontos + 3;
                                                }else{
                                                   if (contador == 5){
                                                        pontos = pontos + 4;
                                                    }else{
                                                       if (contador == 6){
                                                            pontos = pontos + 4;
                                                        }else{
                                                           if (contador == 7){
                                                                pontos = pontos + 5;
                                                            }else{
                                                               if (contador == 8){
                                                                    pontos = pontos + 7;
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                                break;
                            case 'b':
                                pontos = pontos + 320;
                                break;
                            case 'k':
                                break;
                            case 'q':
                                pontos = pontos + 900;
                                if (j == 7){
                                    pontos = pontos + 10;
                                }
                                break;
                            case 'x':
                                JOptionPane.showMessageDialog(null, "ERRO! PEÃ‡A X NÃƒO PODERIA SER JOGADA!");
                               break;
                            default:
                                JOptionPane.showMessageDialog(null, "ERRO! DEFAULT DA MOVIMENTAÃ‡ÃƒO DE PEÃ‡A");
                                break;
                        }
                    }
                }
            }
        }
        vCheck = VerificaCheck(cor);
        if (vCheck) {
            pontos = pontos - 10000;
        }
        return pontos;
    }

    public Peca GetPeca(int x, int y) {
        Peca P;
        P = new Peca(matriz[x][y].GetTipo(), x, y, matriz[x][y].GetCor());
        P.SetMovimentos(matriz[x][y].GetMovimentos());
        return P;
    }

    public void SetPeca(Peca P, int x, int y) {
        matriz[x][y] = new Peca(P.GetTipo(),x,y,P.GetCor());             
       
    }
       
 
    
}